package co.gov.medellin.ssti.sub.service;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.Collection;
import java.util.List;

import javax.naming.NamingException;

import co.gov.medellin.ssti.sub.common.ConexionFactory;
import co.gov.medellin.ssti.sub.model.dao.DAOFactory;
import co.gov.medellin.ssti.sub.model.dao.IUsuarioSubprogramaDAO;
import co.gov.medellin.ssti.sub.model.dao.exception.DAOException;
import co.gov.medellin.ssti.sub.model.vo.AreaVO;
import co.gov.medellin.ssti.sub.model.vo.UsuarioSubprogramaVO;
import co.gov.medellin.ssti.sub.paoyer.administration.model.vo.UserVO;

public class UsuarioSubprogramaService {
	/**
	 * Metodo que consulta los usuarios en paoyer. Si condicion no es empty,
	 * consulta aquellos cuyo NOMBRE o DESCRIPCION sean parecidos a condicion.
	 * 
	 * @param condicion
	 * @return
	 * @throws DAOException
	 */
	public Collection<UsuarioSubprogramaVO> findUsuarios(String condicion)
			throws DAOException {
		IUsuarioSubprogramaDAO usuarioSubprogramaDAO = null;
		try {
			Connection con = ConexionFactory.getInstance().getConnection();
			usuarioSubprogramaDAO = DAOFactory.getDAOFactory(DAOFactory.ORACLE)
					.getUsuarioSubprogramaDAO(con);
			return usuarioSubprogramaDAO.findUsuarios(condicion);
		} catch (NamingException e) {
			throw new DAOException(e);
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			if (usuarioSubprogramaDAO != null) {
				if (!usuarioSubprogramaDAO.isConnClosed()) {
					usuarioSubprogramaDAO.close();
				}
			}
		}
	}

	public long findSubprogramaSede(Long codeSubprograma, Long codeSede)
			throws DAOException {
		IUsuarioSubprogramaDAO usuarioSubprogramaDAO = null;
		try {
			Connection con = ConexionFactory.getInstance().getConnection();
			usuarioSubprogramaDAO = DAOFactory.getDAOFactory(DAOFactory.ORACLE)
					.getUsuarioSubprogramaDAO(con);
			return usuarioSubprogramaDAO.findSubprogramaSede(codeSubprograma,
					codeSede);
		} catch (NamingException e) {
			throw new DAOException(e);
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			if (usuarioSubprogramaDAO != null) {
				if (!usuarioSubprogramaDAO.isConnClosed()) {
					usuarioSubprogramaDAO.close();
				}
			}
		}
	}

	public Collection<UsuarioSubprogramaVO> findNombres(Long codeSubprograma,
			Long codeSede, Long codePrograma, Long codeUsuario)
			throws DAOException {
		IUsuarioSubprogramaDAO usuarioSubprogramaDAO = null;
		try {
			Connection con = ConexionFactory.getInstance().getConnection();
			usuarioSubprogramaDAO = DAOFactory.getDAOFactory(DAOFactory.ORACLE)
					.getUsuarioSubprogramaDAO(con);
			return usuarioSubprogramaDAO.findNombres(codeSubprograma, codeSede,
					codePrograma, codeUsuario);
		} catch (NamingException e) {
			throw new DAOException(e);
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			if (usuarioSubprogramaDAO != null) {
				if (!usuarioSubprogramaDAO.isConnClosed()) {
					usuarioSubprogramaDAO.close();
				}
			}
		}
	}

	public boolean isUsuarioValido(Long codeUsuario, Long codeSubprogramaSede)
			throws DAOException {
		IUsuarioSubprogramaDAO usuarioSubprogramaDAO = null;
		try {
			Connection con = ConexionFactory.getInstance().getConnection();
			usuarioSubprogramaDAO = DAOFactory.getDAOFactory(DAOFactory.ORACLE)
					.getUsuarioSubprogramaDAO(con);
			return usuarioSubprogramaDAO.isUsuarioValido(codeUsuario,
					codeSubprogramaSede);
		} catch (NamingException e) {
			throw new DAOException(e);
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			if (usuarioSubprogramaDAO != null) {
				if (!usuarioSubprogramaDAO.isConnClosed()) {
					usuarioSubprogramaDAO.close();
				}
			}
		}
	}

	public int insertUsuarioSubprograma(Long codeSubprogramaSede,
			Long codeUsuario) throws DAOException {
		IUsuarioSubprogramaDAO usuarioSubprogramaDAO = null;
		try {
			Connection con = ConexionFactory.getInstance().getConnection();
			usuarioSubprogramaDAO = DAOFactory.getDAOFactory(DAOFactory.ORACLE)
					.getUsuarioSubprogramaDAO(con);
			return usuarioSubprogramaDAO.insertUsuarioSubprograma(
					codeSubprogramaSede, codeUsuario);
		} catch (NamingException e) {
			throw new DAOException(e);
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			if (usuarioSubprogramaDAO != null) {
				if (!usuarioSubprogramaDAO.isConnClosed()) {
					usuarioSubprogramaDAO.close();
				}
			}
		}
	}

	public Collection<AreaVO> findSecretaria() throws DAOException {
		IUsuarioSubprogramaDAO usuarioSubprogramaDAO = null;
		try {
			Connection con = ConexionFactory.getInstance().getConnection();
			usuarioSubprogramaDAO = DAOFactory.getDAOFactory(DAOFactory.ORACLE)
					.getUsuarioSubprogramaDAO(con);
			return usuarioSubprogramaDAO.findSecretaria();
		} catch (NamingException e) {
			throw new DAOException(e);
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			if (usuarioSubprogramaDAO != null) {
				if (!usuarioSubprogramaDAO.isConnClosed()) {
					usuarioSubprogramaDAO.close();
				}
			}
		}
	}

	public int insertPermisosReportes(String arr[]) throws DAOException {
		IUsuarioSubprogramaDAO usuarioSubprogramaDAO = null;
		try {
			Connection con = ConexionFactory.getInstance().getConnection();
			usuarioSubprogramaDAO = DAOFactory.getDAOFactory(DAOFactory.ORACLE)
					.getUsuarioSubprogramaDAO(con);
			return usuarioSubprogramaDAO.insertPermisosReportes(arr);
		} catch (NamingException e) {
			throw new DAOException(e);
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			if (usuarioSubprogramaDAO != null) {
				if (!usuarioSubprogramaDAO.isConnClosed()) {
					usuarioSubprogramaDAO.close();
				}
			}
		}
	}

	public List<UsuarioSubprogramaVO> findPermisosUsuarios(Long codeUsuario,
			Long codeSubprograma) throws DAOException {
		IUsuarioSubprogramaDAO usuarioSubprogramaDAO = null;
		try {
			Connection con = ConexionFactory.getInstance().getConnection();
			usuarioSubprogramaDAO = DAOFactory.getDAOFactory(DAOFactory.ORACLE)
					.getUsuarioSubprogramaDAO(con);
			return usuarioSubprogramaDAO.findPermisosUsuarios(codeUsuario,
					codeSubprograma);
		} catch (NamingException e) {
			throw new DAOException(e);
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			if (usuarioSubprogramaDAO != null) {
				if (!usuarioSubprogramaDAO.isConnClosed()) {
					usuarioSubprogramaDAO.close();
				}
			}
		}
	}

	public List<UserVO> findGrupoUsuarios(Long codeUsuario) throws DAOException {
		IUsuarioSubprogramaDAO usuarioSubprogramaDAO = null;
		try {
			Connection con = ConexionFactory.getInstance().getConnection();
			usuarioSubprogramaDAO = DAOFactory.getDAOFactory(DAOFactory.ORACLE)
					.getUsuarioSubprogramaDAO(con);
			return usuarioSubprogramaDAO.findGrupoUsuarios(codeUsuario);
		} catch (NamingException e) {
			throw new DAOException(e);
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			if (usuarioSubprogramaDAO != null) {
				if (!usuarioSubprogramaDAO.isConnClosed()) {
					usuarioSubprogramaDAO.close();
				}
			}
		}
	}

	public String findCodeSubprograma(Long codeSubprogramaSede)
			throws DAOException {
		IUsuarioSubprogramaDAO usuarioSubprogramaDAO = null;
		try {
			Connection con = ConexionFactory.getInstance().getConnection();
			usuarioSubprogramaDAO = DAOFactory.getDAOFactory(DAOFactory.ORACLE)
					.getUsuarioSubprogramaDAO(con);
			return usuarioSubprogramaDAO
					.findCodeSubprograma(codeSubprogramaSede);
		} catch (NamingException e) {
			throw new DAOException(e);
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			if (usuarioSubprogramaDAO != null) {
				if (!usuarioSubprogramaDAO.isConnClosed()) {
					usuarioSubprogramaDAO.close();
				}
			}
		}
	}

	public Long findCodeSede(Long codeSubprogramaSede) throws DAOException {
		IUsuarioSubprogramaDAO usuarioSubprogramaDAO = null;
		try {
			Connection con = ConexionFactory.getInstance().getConnection();
			usuarioSubprogramaDAO = DAOFactory.getDAOFactory(DAOFactory.ORACLE)
					.getUsuarioSubprogramaDAO(con);
			return usuarioSubprogramaDAO.findCodeSede(codeSubprogramaSede);
		} catch (NamingException e) {
			throw new DAOException(e);
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			if (usuarioSubprogramaDAO != null) {
				if (!usuarioSubprogramaDAO.isConnClosed()) {
					usuarioSubprogramaDAO.close();
				}
			}
		}
	}

	public Long findCodePrograma(Long codeSubSede) throws DAOException {
		IUsuarioSubprogramaDAO usuarioSubprogramaDAO = null;
		try {
			Connection con = ConexionFactory.getInstance().getConnection();
			usuarioSubprogramaDAO = DAOFactory.getDAOFactory(DAOFactory.ORACLE)
					.getUsuarioSubprogramaDAO(con);
			return usuarioSubprogramaDAO.findCodePrograma(codeSubSede);
		} catch (NamingException e) {
			throw new DAOException(e);
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			if (usuarioSubprogramaDAO != null) {
				if (!usuarioSubprogramaDAO.isConnClosed()) {
					usuarioSubprogramaDAO.close();
				}
			}
		}
	}
}
